﻿using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;

namespace HMS
{
    public partial class ucNguoidung : UserControl
    {
        private static string sGetID, sMaND, sTenND, sTenND_new, sHoND, sHoND_new, sTenTK,
            sTenTK_new, sPass, sPass_new, sAcc, sAcc_new;
        private SqlConnection con = new SqlConnection(FRM_Manhinhchinh.sConn);
        private SqlDataAdapter daLoadUser, dataAp;
        private SqlCommand cmd1, cmd2, cmd3;
        private DataTable tbLoadUser, dataTable;
        private List<string> list;
        private bool bUpdate, bCheck;
        private int iIndex, iIDex;

        // Khởi tạo giao diện Usercontrol người dùng
        public ucNguoidung()
        {
            InitializeComponent();
            load_data();
        }// end

        // Load dữ liệu từ database lên Gridview
        public void load_data()
        {
            daLoadUser = new SqlDataAdapter("select user_serial, userid,"
                + " (user_lname+' '+user_fname) as user_name, account_name,"
                + " account_status from tblUser", con);
            tbLoadUser = new DataTable();
            daLoadUser.Fill(tbLoadUser);
            gridNguoidung.DataSource = tbLoadUser;
        }// end load_data

        /// <summary>
        /// Fill data from DB to DataTable
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public DataTable GetDataTable(string sql)
        {
            // Tạo dataApdapter, thực hiện câu lệnh query
            dataAp = new SqlDataAdapter(sql, con);
            // Đổ dữ liệu vào DataTable
            dataTable = new DataTable();
            dataAp.Fill(dataTable);
            return dataTable;
        }// end GetDataTable

        /// <summary>
        /// Get danh sách quyền hệ thống
        /// </summary>
        private void Load_DSQuyenhethong()
        {
            string sSQL = "select authorization_name from tblgroupauthorization where"
            + " authorization_id not in (select g.authorization_id from tbluser u,"
            + " tblgroupauthorization g, tblauthorization a where u.userid='"
            + sGetID + "' and u.userid=a.userid and a.authorization_id = g.authorization_id)";
            GetDataTable(sSQL); // Tạo bảng dữ liệu để load dữ liệu danh sách quyền hệ thống
            lbQuyenhethong.Items.Clear(); // Clear - làm mới listbox danh sách quyền hệ thống
            list = new List<string>(); // Tạo mới list lưu trữ

            // Thêm các dòng của bảng dữ liệu vào listbox danh sách quyền hệ thống
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                list.Add(dataTable.Rows[i]["authorization_name"].ToString());
                lbQuyenhethong.Items.Add(list[i]);
                lbQuyenhethong.Items[i] = list[i].ToString();
            }// end for
        }// end Load_DSQuyenhethong

        /// <summary>
        /// Get danh sách quyền người dùng
        /// </summary>
        private void Load_DSQuyennguoidung()
        {
            string sSQL = "select g.authorization_id, g.authorization_name from tbluser u"
                + ", tblgroupauthorization g, tblauthorization a where u.userid='"
                + sGetID + "' and u.userid=a.userid and a.authorization_id = g.authorization_id";
            GetDataTable(sSQL);  // Tạo bảng dữ liệu để load dữ liệu danh sách quyền người dùng
            list = new List<string>(); // Tạo mới list lưu trữ
            lbQuyennguoidung.Items.Clear(); // Clear - làm mới listbox danh sách quyền hệ thống

            // Thêm các dòng của bảng dữ liệu vào listbox danh sách quyền người dùng
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                list.Add(dataTable.Rows[i]["authorization_name"].ToString());
                lbQuyennguoidung.Items.Add(list[i]);
                lbQuyennguoidung.Items[i] = list[i].ToString();
            }// end for
        }// end Load_DSQuyennguoidung

        /// <summary>
        /// Gán dữ liệu DB vào cmb List phòng ban
        /// </summary>
        private void Load_ListPhongBan()
        {
            string sSQL = "select department_name, department_id from tbldepartment";
            GetDataTable(sSQL); // Tạo bảng dữ liệu để load dữ liệu
            LUEPhongban.Properties.DataSource = dataTable;
            LUEPhongban.Properties.DisplayMember = "department_name";
            LUEPhongban.Properties.ValueMember = "department_id";
        }// end Load_ListPhongBan

        // Kiểm tra tài khoản đã tồn tại chưa
        private bool Check_Taikhoan(string s)
        {
            string sql = "select account_name from tbluser where account_name = '" + s + "'";
            SqlCommand cmdCheck = new SqlCommand(sql, con);
            con.Open();
            SqlDataReader dr;
            dr = cmdCheck.ExecuteReader();
            if (dr.Read() == true) bCheck = false;
            else bCheck = true;
            con.Close();
            return bCheck;
        }// end Check_Taikhoan

        // Gán dữ liệu từ DB lên giao diện
        private void setData()
        {
            iIndex = gridView1.FocusedRowHandle;            
            sGetID = gridView1.GetRowCellValue(iIndex, "userid").ToString();

            // Gán dữ liệu lấy từ DB vào data table
            string sSQL = "select account_password, userid, user_fname, user_lname"
                + ", account_name, account_status, u.department_id, d.department_name"
                + " from tbluser u, tbldepartment d where userid = '" + sGetID
                + "' and u.department_id = d.department_id";
            GetDataTable(sSQL);

            // Gán text cho textbox
            txtManguoidung.Text = dataTable.Rows[0]["userid"].ToString(); // Gán text cột userid cho txtManguoidung
            sPass = txtMatkhau.Text = MD5.GiaiMaMD5(dataTable.Rows[0]["account_password"].ToString(), true); // Gán text cột account_password cho txtMatkhau
            sTenND = txtTennguoidung.Text = dataTable.Rows[0]["user_fname"].ToString(); // Gán text cột user_fname cho txtTennguoidung
            sHoND = txtHonguoidung.Text = dataTable.Rows[0]["user_lname"].ToString(); // Gán text cột user_lname cho txtHonguoidung
            sTenTK = txttentaikhoan.Text = dataTable.Rows[0]["account_name"].ToString(); // Gán text cột account_name cho txttentaikhoan
            string ss = dataTable.Rows[0]["department_name"].ToString();
            LUEPhongban.Text = ss;

            // Đọc từ DB set true, false cho nút check "Kích hoạt"
            if (dataTable.Rows[0]["account_status"].ToString() == "True")
                ckKichhoat.Checked = true;
            else ckKichhoat.Checked = false;
            if (ckKichhoat.Checked == true) sAcc = "True";
            else sAcc = "False";

            // Load list phòng ban từ DB
            Load_ListPhongBan();

            // Load danh sách quyền người dùng từ DB của người dùng đó
            Load_DSQuyennguoidung();

            // Load danh sách quyền mặc định của hệ thống từ DB
            Load_DSQuyenhethong();
        }// end setData

        // Kiểm tra textbox rỗng
        private bool emptyData()
        {
            if (txtHonguoidung.Text == null ||
                txttentaikhoan.Text == null ||
                txtTennguoidung.Text == null ||
                LUEPhongban.Text == null || lbQuyennguoidung.Items.Count == 0)
                return false;
            else return true;
        }// end emptyData

        // Kiểm tra textbox thay đổi
        private bool changedData()
        {
            sTenND_new = txtTennguoidung.Text;
            sHoND_new = txtHonguoidung.Text;
            sTenTK_new = txttentaikhoan.Text;
            sPass_new = txtMatkhau.Text;
            if (ckKichhoat.Checked == true) sAcc_new = "True";
            else sAcc_new = "False";
            if (!sTenTK_new.Equals(sTenTK) ||
                !sTenND_new.Equals(sTenND) ||
                !sHoND_new.Equals(sHoND) ||
                !sPass_new.Equals(sPass) ||
                !sAcc_new.Equals(sAcc)) { return true; }
            else return false;
        }// end changedData

        // Làm mới nội dung
        private void clear_Contents()
        {
            txtManguoidung.Text = null;
            txtMatkhau.Text = null;
            txtHonguoidung.Text = null;
            txtTennguoidung.Text = null;
            txttentaikhoan.Text = null;
            LUEPhongban.Enabled = true;
            ckKichhoat.Checked = false;
            Load_ListPhongBan();
            lbQuyennguoidung.DataSource = null;
            lbQuyenhethong.DataSource = null;
        }// end enable_Button

        // Mã tự động tăng hiện trên textbox
        private string NextID()
        {
            GetDataTable("select max(Userid) as userid from tbluser");
            string sMaND = dataTable.Rows[0]["Userid"].ToString();
            int iMaND = int.Parse(sMaND.Remove(0, 1)) + 1;
            int lengthNumerID = sMaND.Length - 1;
            string zeroNumber = "";
            for (int i = 1; i <= lengthNumerID; i++)
                if (iMaND < Math.Pow(10, i))
                {
                    for (int j = 1; j <= lengthNumerID - i; i++)
                        zeroNumber += "0";
                    return "T" + zeroNumber + iMaND.ToString();
                }// end if
            return "T" + iMaND;
        }// end NextID()

        #region Di chuyển quyền người dùng
        // Di chuyển quyền chọn từ người dùng về lại hệ thống
        private void btnXoaQ_Click(object sender, EventArgs e)
        {
            Object item = lbQuyennguoidung.SelectedItem;
            // remove và add Item ra khỏi listbox
            if (item != null)
            {
                lbQuyennguoidung.Items.Remove(item);
                lbQuyenhethong.Items.Add(item);
            }// end if
            else return;
        }// end btnXoaQ_Click

        // Di chuyển quyền chọn từ hệ thống sang người dùng
        private void btnThemQ_Click(object sender, EventArgs e)
        {
            Object item = lbQuyenhethong.SelectedItem;
            if (item != null)
            {
                lbQuyenhethong.Items.Remove(item);
                lbQuyennguoidung.Items.Add(item);
            }// end if
            else return;
        }// end btnThemQ_Click

        #endregion

        #region Tác vụ Lưu và Hủy bỏ
        /// <summary>
        /// Hủy tác vụ đang thực hiện
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnHuy_Click(object sender, EventArgs e)
        {
            if (bUpdate == false)
            {
                if (changedData() == true)
                {
                    DialogResult dr = MessageBox.Show("Bạn chắc chắn muốn hủy thao tác này ?", "Thông báo", MessageBoxButtons.YesNo);
                    if (dr == DialogResult.Yes) btnTaoTK_Click(null, null);
                    else return;
                }// end if
                else
                {
                    if (lbQuyennguoidung.Items.Count == 0) return;
                    else
                    {
                        DialogResult dr = MessageBox.Show("Bạn chắc chắn muốn hủy thao tác này ?", "Thông báo", MessageBoxButtons.YesNo);
                        if (dr == DialogResult.Yes) btnTaoTK_Click(null, null);
                        else return;
                    }// end else
                }// end else
            }// end if
            else
            {
                // Kiểm tra dữ liệu có thay đổi chưa
                if (changedData() == true)
                {
                    DialogResult dr = MessageBox.Show("Bạn chắc chắn muốn hủy thao tác này ?", "Thông báo", MessageBoxButtons.YesNo);
                    if (dr == DialogResult.Yes) btnCapnhatTK_Click(null, null);
                    else return;
                }// end if
                else return;
            }// end else
        }// end btnHuy_Click

        /// <summary>
        /// Xử lý lệnh Lưu hay Tạo từ nút "Lưu"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLuuTK_Click(object sender, EventArgs e)
        {
            // Khai báo biến
            list = new List<string>();
            DataRowView dr = (DataRowView)LUEPhongban.GetSelectedDataRow();
            iIDex = int.Parse(dr["department_id"].ToString());

            //iIDex = cmbPhongban.SelectedIndex;
            string sTenND = txtTennguoidung.Text, sHoND = txtHonguoidung.Text,
                         sTenTK = txttentaikhoan.Text, sPass = MD5.MaHoaMD5(txtMatkhau.Text, true),
                         sAcc, sPhongban = LUEPhongban.Text;
            sMaND = txtManguoidung.Text;
            // Trạng thái là Lưu người dùng hay Tạo người dùng
            switch (bUpdate)
            {
                // Trạng thái Tạo mới người dùng
                case false:
                    // Kiểm tra có ô trống hay không
                    if (emptyData() == true)
                    {
                        SqlConnection conInsert = new SqlConnection(FRM_Manhinhchinh.sConn); // Tạo kết nối DB
                        if (ckKichhoat.Checked == true) sAcc = "True";
                        else sAcc = "False";
                        string sCmdInsertUser = "insert into tbluser values ('','',N'"
                            + sTenND + "',N'" + sHoND + "','" + sAcc + "','" + sTenTK + "','"
                            + sPass + "','" + iIDex + "')";
                        // Kiểm tra tên tài khoản đã tồn tại hay chưa
                        if (Check_Taikhoan(sTenTK) == true)
                        {
                            conInsert.Open(); // Mở kết nối DB
                            cmd1 = new SqlCommand(sCmdInsertUser, conInsert); // Câu lệnh Insert dữ liệu vào DB                    
                            cmd1.ExecuteNonQuery(); // Thực thi lệnh SqlCommand
                            // Thêm danh sách quyền vào Listbox và CSDL
                            for (int i = 0; i < lbQuyennguoidung.Items.Count; i++)
                            {
                                string sSQL = "select authorization_id from tblgroupauthorization where authorization_name = N'"
                                    + lbQuyennguoidung.Items[i].ToString() + "'";
                                GetDataTable(sSQL); // Tạo bảng dữ liệu để load dữ liệu                       
                                list.Add(dataTable.Rows[0]["authorization_id"].ToString());
                                // Thêm quyền cho người dùng vào DB
                                cmd2 = new SqlCommand("insert into tblauthorization values ('"
                                    + int.Parse(list[i].ToString()) + "','" + sMaND + "')", conInsert);
                                cmd2.ExecuteNonQuery(); // Thực thi lệnh SqlCommand
                            }// end for
                            conInsert.Close(); // Đóng kết nối DB
                            MessageBox.Show("Tạo mới người dùng thành công !");
                            load_data(); // Load lại data lên gridControl
                        }// end if
                        else MessageBox.Show("Tên tài khoản đã tồn tại !");
                    }// end if
                    else MessageBox.Show("Vui lòng nhập đầy đủ thông tin !");
                    break;

                // Trạng thái Cập nhật người dùng
                case true:
                    // Kiểm tra có ô trống hay không
                    if (emptyData() == true)
                    {
                        SqlConnection conUpdate = new SqlConnection(FRM_Manhinhchinh.sConn);
                        string sCmdDeleteAuthorization = "delete from tblauthorization where userid = '"
                            + sMaND + "'";
                        if (ckKichhoat.Checked == true) sAcc = "True";
                        else sAcc = "False";
                        string sCmdUpdatePass = "update tbluser set account_password = '" +
                            sPass + "', account_status = '" + sAcc
                            + "', user_fname = N'" + sTenND + "', user_lname = N'" +
                            sHoND + "', department_id = '" + iIDex + "' where userid = '" + sMaND + "'";
                        conUpdate.Open();
                        cmd1 = new SqlCommand(sCmdDeleteAuthorization, conUpdate); // Xóa quyền sẵn có trong DB của người dùng đó
                        cmd1.ExecuteNonQuery(); // Thực thi lệnh SqlCommand
                        cmd2 = new SqlCommand(sCmdUpdatePass, conUpdate); // Cập nhật mật khẩu
                        cmd2.ExecuteNonQuery(); // Thực thi lệnh SqlCommand
                        // Thêm lại quyền người dùng vào DB
                        for (int i = 0; i < lbQuyennguoidung.Items.Count; i++)
                        {
                            string sSQL = "select authorization_id from tblgroupauthorization where authorization_name = N'" +
                                lbQuyennguoidung.Items[i].ToString() + "'";
                            GetDataTable(sSQL); // Tạo bảng dữ liệu để load dữ liệu
                            list.Add(dataTable.Rows[0]["authorization_id"].ToString());
                            cmd3 = new SqlCommand("insert into tblauthorization values ('" + int.Parse(list[i].ToString())
                                + "','" + sMaND + "')", conUpdate); // Thêm quyền người dùng vào DB
                            cmd3.ExecuteNonQuery(); // Thực thi lệnh SqlCommand
                        }// end for
                        conUpdate.Close(); // Đóng kết nối DB
                        MessageBox.Show("Cập nhật tài khoản thành công !");
                        load_data(); // Load lại data lên gridControl
                    }// end if
                    else MessageBox.Show("Vui lòng nhập đầy đủ thông tin !");
                    break;
            }// end switch
        }// end btnLuuTK_Click
        #endregion

        #region Tạo và Cập nhật tài khoản
        /// <summary>
        /// Cập nhật tài khoản
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCapnhatTK_Click(object sender, EventArgs e)
        {
            bUpdate = true;
            btnLuuTK.Enabled = true;
            btnHuy.Enabled = true;
            txttentaikhoan.Enabled = true;
            txtHonguoidung.Enabled = true;
            txtTennguoidung.Enabled = true;
            LUEPhongban.Enabled = true;
            ckKichhoat.Enabled = true;
            btnThemQ.Enabled = true;
            btnXoaQ.Enabled = true;
            btnResetpass.Enabled = true;
            setData();

            // AutoComplete txttentaikhoan
            GetDataTable("select account_name from tbluser");
            foreach (DataRow item in dataTable.Rows)
                txttentaikhoan.AutoCompleteCustomSource.Add(item["account_name"].ToString());
        }// end btnCapnhatTK_Click

        /// <summary>
        /// Tạo người dùng
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnTaoTK_Click(object sender, EventArgs e)
        {
            // Khai báo biến và thuộc tính
           
            bUpdate = false;
            btnResetpass.Enabled = false;
            btnHuy.Enabled = true;
            txttentaikhoan.Enabled = true;
            ckKichhoat.Enabled = true;
            btnThemQ.Enabled = true;
            btnXoaQ.Enabled = true;
            txtHonguoidung.Enabled = true;
            txtTennguoidung.Enabled = true;
            btnLuuTK.Enabled = true;
            clear_Contents();
            lbQuyenhethong.Items.Clear();
            lbQuyennguoidung.Items.Clear();
            Load_ListPhongBan();
            string sSQL = "select authorization_name from tblgroupauthorization";
            GetDataTable(sSQL); // Tạo bảng dữ liệu để load dữ liệu
            list = new List<string>();
            // load danh sách quyền hệ thống lên listbox
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                list.Add(dataTable.Rows[i]["authorization_name"].ToString());
                lbQuyenhethong.Items.Add(list[i]);
                lbQuyenhethong.Items[i] = list[i].ToString();
            }// end for

            // AutoComplete txttentaikhoan
            GetDataTable("select account_name from tbluser");
            foreach (DataRow item in dataTable.Rows)
                txttentaikhoan.AutoCompleteCustomSource.Add(item["account_name"].ToString());

            con.Close(); // Close connection SQL
            txtManguoidung.Text = NextID(); // Hiển thị mã tự động tăng
            txtMatkhau.Enabled = false;
            sPass = txtMatkhau.Text = txtManguoidung.Text;
            sTenND = sHoND = sTenTK = "";
            sAcc = "False";
        }// end btnTaoTK_Click
        #endregion

        /// <summary>
        /// Sự kiện click trên gridControl
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridNguoidung_Click(object sender, EventArgs e)
        {
            // enable button
            btnHuy.Enabled = false;
            btnResetpass.Enabled = false;
            txttentaikhoan.Enabled = false;
            txtHonguoidung.Enabled = false;
            txtTennguoidung.Enabled = false;
            LUEPhongban.Enabled = false;
            txtMatkhau.Enabled = false;
            ckKichhoat.Enabled = false;
            btnThemQ.Enabled = false;
            btnXoaQ.Enabled = false;
            btnLuuTK.Enabled = false;
            setData();
        }// end gridControl1_Click

        private void btnResetpass_Click(object sender, EventArgs e)
        {
            txtMatkhau.Text = txtManguoidung.Text;
        }

        private void gridNguoidung_DoubleClick(object sender, EventArgs e)
        {
            btnCapnhatTK_Click(null, null);
        }
    }// end
}// end